from models.comment_schema import RawComment
from utils.config_loader import Config
import logging

from models.comment_schema import RawComment, AnalyzedComment
from sqlalchemy import or_
import time

def get_sample_comments(db_manager, last_id=0, batch_size=5, analyzed_flag=False, source_table='raw'):
    """
    获取待分析评论（支持 raw 表）
    :param db_manager: DatabaseManager 实例
    :param last_id: 上次处理的最后ID
    :param batch_size: 每次读取数量
    :param analyzed_flag: 是否为已分析评论（True=已分析，False=未分析）
    :param source_table: 来源表（'raw' 或 'analyzed'）
    """
    from sqlalchemy import and_
    
    max_retries = 3
    retry_count = 0
    
    while retry_count < max_retries:
        session = db_manager.Session()
        try:
            # 构建查询语句
            if source_table == 'raw':
                query = session.query(RawComment).filter(
                    and_(
                        RawComment.is_analyzed == False,
                        RawComment.analyzed_at.is_(None),
                        RawComment.id > last_id
                    )
                ).order_by(RawComment.id).limit(batch_size)
            elif source_table == 'analyzed':
                query = session.query(AnalyzedComment).filter(
                    AnalyzedComment.id > last_id
                ).order_by(AnalyzedComment.id).limit(batch_size)
            else:
                raise ValueError(f"❌ 不支持的 source_table 参数: {source_table}")

            results = query.all()
            logging.info(f"🔍 查询到 {len(results)} 条原始评论")  # 新增日志
            if not results:
                logging.info("⚠️ 没有获取到任何原始评论，请检查数据库是否包含未分析评论")
                return []

            for comment in results:
                logging.debug(f"📌 评论ID: {comment.id}, 内容: '{comment.comment_text[:50]}'")  # 打印评论片段

            return [
                dict(
                    comment_id=comment.id,
                    comment_text=comment.comment_text,
                    video_source_id=comment.video_source_id,
                    like_count=comment.like_count,  # 新增：同步点赞数
                    platform=comment.platform,
                    parent_id=comment.parent_id,
                    parent_text=comment.parent_text,
                    top_comment_id=comment.top_comment_id
                ) for comment in results
            ]

        except Exception as e:
            retry_count += 1
            if retry_count >= max_retries or ("MySQL server has gone away" not in str(e) and "Can't connect to MySQL server" not in str(e)):
                logging.error(f"❌ 获取评论失败: {str(e)}", exc_info=True)
                return []
            else:
                logging.warning(f"⚠️ 数据库连接问题，第 {retry_count} 次重试...")
                time.sleep(2 ** retry_count)  # 指数退避
        finally:
            session.close()